# -*- coding: utf-8 -*-
import jqktrader
import warnings
from datetime import datetime
import requests
import pyautogui
import time
import pytesseract
import re

warnings.filterwarnings('ignore', '.*32-bit application should be automated using 32-bit Python.*')
# 用户提供的四个坐标
top_left_x1, top_left_y1 = 1049, 564
bottom_right_x1, bottom_right_y1 = 779, 283

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'


def shibie():
    try:
        # start_time = time.time()  # 记录开始时间

        coordinates1 = (top_left_x1, top_left_y1, bottom_right_x1, bottom_right_y1)

        # 截取屏幕上指定区域的图像
        screenshot1 = pyautogui.screenshot(region=coordinates1)
        screenshot1.save('screenshot1.png')

        # 将截图转为灰度图（如果需要）
        gray_screenshot1 = screenshot1.convert('L')
        # 使用Tesseract进行OCR
        # 使用正则表达式匹配连续的6位数字
        text1 = pytesseract.image_to_string(gray_screenshot1, config='--psm 6 digits')
        # text1 = pytesseract.image_to_string(gray_screenshot1, lang='chi_sim')
        print(text1)
        match = re.search(r'\d{6}', text1)
        if match:
            result = match.group()  # 输出数字部分
        else:
            result = 0  # 否则输出提示文字



        return result
    except:
        print("读取图片信息错误")
        return 0



def format_stock_code(stock_code):
    if stock_code.startswith('6') or stock_code.startswith('5'):
        return 'SHSE.' + stock_code  # 上海交易所
    elif stock_code.startswith('0') or stock_code.startswith('3') or stock_code.startswith('1'):
        return 'SZSE.' + stock_code  # 深圳交易所
    else:
        return stock_code  # 如果不符合上述任何模式，就返回原股票代码


def add_exchange_prefix(stock_code):
    if stock_code.startswith('6') or stock_code.startswith('5'):
        return 'sh' + stock_code  # 上海交易所
    elif stock_code.startswith('0') or stock_code.startswith('3') or stock_code.startswith('1'):
        return 'sz' + stock_code  # 深圳交易所
    else:
        return "未知交易所"


def getTick(symbol):
    # 0: 未知 1: 名字 2: 代码 3: 当前价格 4: 昨收 5: 今开 6: 成交量（手）7: 外盘 8: 内盘 9: 买一 10: 买一量（手）11-18: 买二 买五 19: 卖一
    # 20: 卖一量 21-28: 卖二 卖五 29: 最近逐笔成交 30: 时间 31: 涨跌 32: 涨跌% 33: 最高 34: 最低 35: 价格/成交量（手）/成交额 36: 成交量（手）
    # 37: 成交额（万）38: 换手率 39: 市盈率 40: 41: 最高 42: 最低 43: 振幅 44: 流通市值 45: 总市值 46: 市净率 47: 涨停价 48: 跌停价
    try:
        page = requests.get("http://qt.gtimg.cn/q=" + symbol)
        stock_info = page.text
        info = stock_info.split("~")
        t = (info[1], info[3], info[47])
        return t
    except:
        print("取TICK数据抛出异常")


def calculate_shares(initial_funds, price):
    # 计算可以购买多少份（向下取整到最接近但小于结果的100的倍数）
    shares = initial_funds // price // 100 * 100
    return shares





def buy(symbol, jiage, num):
    user = jqktrader.use()
    try:
        user.connect(
            exe_path=r"C:\同花顺软件\同花顺\xiadan.exe",
            tesseract_cmd=r'C:\Program Files\Tesseract-OCR\tesseract.exe'
        )
    except:
        print("请打开客户端")
    user.buy(symbol, price=jiage, amount=num)


def getBalance():
    user = jqktrader.use()
    try:
        user.connect(
            exe_path=r'C:\同花顺软件\同花顺\xiadan.exe',
            tesseract_cmd=r'C:\Program Files\Tesseract-OCR\tesseract.exe'
        )
    except:
        print("请打开客户端")
    user.refresh()
    return user.balance





def main_logic():
    initial_funds = getBalance()['可用金额']
    print("您的可用的资金为:", initial_funds)
    if initial_funds > 0:
        while True:
            # 监听信息，获取股票代码
            t = shibie()
            t = '601988'
            print(t)
            if t != 0:
                try:
                    s = add_exchange_prefix(t)
                    try:
                        temp = getTick(s)
                        if not temp:
                            raise ValueError("获取股票数据失败，可能是遮挡了聊天界面,或者识别到到股票错误，请检查....")
                        price = round(float(temp[1]) * 1.01, 2)
                        print("当前价格为 {} ".format(float(temp[1])))
                        print("挂单价格为 {} ".format(price))
                        shares = calculate_shares(initial_funds, price) - 100
                        if shares < 100:
                            print("可购买数量不足100手，请转入资金后再运行程序")
                            break
                        print("最多可以购买 {} 手".format(shares))
                        buy(s, price, '100')
                        time.sleep(1)
                        break
                    except Exception as e:
                        print(f"获取股票数据时发生错误：{e}")
                        continue  # 继续尝试下一次循环
                except Exception as e:
                    print(f"程序运行抛出异常：{e}")
                    continue  # 继续尝试下一次循环

            else:
                current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                print(f"当前时间: {current_time}，程序持续监控中....")

    else:
        print("可用资金不足！！请转入！！")

if __name__ == '__main__':
    main_logic()

